package br.com.pessoajuridica;

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.util.Random;

import br.com.validadores.Validadores;

public class Cnpj implements Validadores {

	@Override
	public void copiar(String documento) {
		
		Clipboard textoCpf = Toolkit.getDefaultToolkit().getSystemClipboard();
		StringSelection selection = new StringSelection(documento);
		textoCpf.setContents(selection, null);
		
	}

	@Override
	public String gerar() {
		
		String cnpj = null;
		String numero = null;
		String verificador = null;
		
		numero = gerarAleatorio();
		verificador = gerarVerificadores(numero);
		cnpj = numero + verificador;
		
		StringBuilder mascara = new StringBuilder(cnpj);
		
		return mascara.insert(2, '.').insert(6, '.').insert(10, '/').insert(15, '-').toString();
		
	}

	private String gerarAleatorio() {
		
		int[] intNum = new int[12];
		String[] strNum = new String[intNum.length];
		
		StringBuilder num = new StringBuilder();
		String cnpj = null;
		
		Random random = new Random();
		
		for (int i = 0; i < 12; i++) {
			
			intNum[i] = random.nextInt(9);
			strNum[i] = String.valueOf(intNum[i]);
			num.append(strNum[i]);
			
		}
		
		cnpj = num.toString();
		return cnpj;
		
	}

	private String gerarVerificadores(String documento) {
		
		int iDigito1Aux = 0;
		int iDigito2Aux = 0;
		int iDigito1 = 0;
		int iDigito2 = 0;
		int iDigitosCNPJ = 0;
		int iRestoDivisao = 0;
		
		String iResultado = null;
		String digitosCnpj = null;
		
		if (!documento.subSequence(0, 1).equals("")) {
			
			try {
				
				documento = documento.replace('.', ' ').replace('/', ' ').replace('-', ' ')
						.replaceAll(" ", "");
				
				digitosCnpj = documento;
					
				/* Primeira parte */
				for (int iCont = 1; iCont < digitosCnpj.length() + 1; iCont++) {
					
					iDigitosCNPJ = Integer.valueOf(digitosCnpj.substring(iCont - 1, iCont)).intValue();
					
					if (iCont < 5) {
						
						iDigito1Aux = iDigito1Aux + (6 - iCont) * iDigitosCNPJ;
						
					} 
					
					if (iCont >= 5 && iCont < 13) {
					
						iDigito1Aux = iDigito1Aux + (14 - iCont) * iDigitosCNPJ;
						
					}
					
				}
				
				iRestoDivisao = iDigito1Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito1 = 0;
					
				} else {
					
					iDigito1 = 11 - iRestoDivisao;
					 
				}
				
				/* Parte 2 */
				digitosCnpj = digitosCnpj + String.valueOf(iDigito1);
				
		        for (int iCont = 1; iCont < digitosCnpj.length() + 1; iCont++) {
					
					iDigitosCNPJ = Integer.valueOf(digitosCnpj.substring(iCont - 1, iCont)).intValue();
					
					if (iCont < 6) {
						
						iDigito2Aux = iDigito2Aux + (7 - iCont) * iDigitosCNPJ;
						
					} 
					
					if (iCont >= 6 && iCont < 14) {
						
						iDigito2Aux = iDigito2Aux + (15 - iCont) * iDigitosCNPJ;
						
					}
					
				}
		        
		        iRestoDivisao = iDigito2Aux % 11;
		        
		        if ((iRestoDivisao < 2)) {
		        	
		        	iDigito2 = 0;
		        	
		        } else {
		        	
		        	iDigito2 = 11 - iRestoDivisao;
		        	
		        }
		         
		        iResultado = String.valueOf(iDigito1) + String.valueOf(iDigito2);
		        
		        return iResultado;
				
			} catch (Exception e) {
				
				e.printStackTrace();
				
			}
			
		} 
		
		return iResultado;
		
	}

	@Override
	public boolean validar(String documento) {
		
		int iDigito1Aux = 0;
		int iDigito2Aux = 0;
		int iDigito1 = 0;
		int iDigito2 = 0;
		int iDigitosCNPJ = 0;
		int iRestoDivisao = 0;
		
		String iDigitosVerificadores;
		String iResultado = null;
		String digitosCnpj = null;
		
		if (!documento.subSequence(0, 1).equals("")) {
			
			try {
				
				documento = documento.replace('.', ' ').replace('/', ' ').replace('-', ' ')
						.replaceAll(" ", "");
				
				digitosCnpj = documento;
				
				if (digitosCnpj.length() < 14)
					return false;
				
				/* Primeira parte */
				for (int iCont = 1; iCont < digitosCnpj.length() - 1; iCont++) {
					
					iDigitosCNPJ = Integer.valueOf(digitosCnpj.substring(iCont - 1, iCont)).intValue();
					
					if (iCont < 5) {
						
						iDigito1Aux = iDigito1Aux + (6 - iCont) * iDigitosCNPJ;
						
					} 
					
					if (iCont >= 5 && iCont < 13) {
					
						iDigito1Aux = iDigito1Aux + (14 - iCont) * iDigitosCNPJ;
						
					}
					
				}
				
				iRestoDivisao = iDigito1Aux % 11;
				
				if (iRestoDivisao < 2) {
					
					iDigito1 = 0;
					
				} else {
					
					iDigito1 = 11 - iRestoDivisao;
					 
				}
				
				/* Parte 2 */
				digitosCnpj = digitosCnpj + String.valueOf(iDigito1);
				
		        for (int iCont = 1; iCont < digitosCnpj.length() - 1; iCont++) {
					
					iDigitosCNPJ = Integer.valueOf(digitosCnpj.substring(iCont - 1, iCont)).intValue();
					
					if (iCont < 6) {
						
						iDigito2Aux = iDigito2Aux + (7 - iCont) * iDigitosCNPJ;
						
					} 
					
					if (iCont >= 6 && iCont < 14) {
						
						iDigito2Aux = iDigito2Aux + (15 - iCont) * iDigitosCNPJ;
						
					}
					
				}
		        
		        iRestoDivisao = iDigito2Aux % 11;
		        
		        if ((iRestoDivisao < 2)) {
		        	
		        	iDigito2 = 0;
		        	
		        } else {
		        	
		        	iDigito2 = 11 - iRestoDivisao;
		        	
		        }
		         
		        iDigitosVerificadores = documento.substring(documento.length() - 2, documento.length());
		        iResultado = String.valueOf(iDigito1) + String.valueOf(iDigito2);
		        
		        return iDigitosVerificadores.equals(iResultado);
				
			} catch (Exception e) {
				
				System.out.println(String.valueOf(iDigito1) + String.valueOf(iDigito2));
				return false;
				
			}
			
		} else {
			
			System.out.println(String.valueOf(iDigito1) + String.valueOf(iDigito2));
			return false;
			
		}
		
	}
	
}
